from fastapi import FastAPI, Query
import uvicorn
from typing import Union, List, Optional

app = FastAPI()
fake_item_db = [{"item_name": "foo"}, {"item_name": "bar"}, {"item_name": "baz"}, {"item_name": "qux"},
                {"item_name": "quux"}, {"item_name": "quzy"}, {"item_name": "quzy2"}]


@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):  # 默认值 skip = 0, limit  = 10
    return fake_item_db[skip:skip + limit]


# 默认值设置为 None
@app.get("/items/{item_id}")
async def read_item1(item_id: str, q: Union[str, None] = None, short: bool = False):
    '''
    Union类型是⼀种⽤于表⽰⼀个变量可以是多个不同类型之⼀的类型注解。它是typing模块中的⼀个
    类，可以与其他类型⼀起使⽤，以指定⼀个变量可以接受的多个类型。
    Union类型的语法为：Union[type1,type2,...]
    这⾥的type1、type2等代表要包含在Union类型中的类型
    '''
    item = {"item_id": item_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "this is an amazing item that has a lang description"}
        )
    return item


# 查询参数成为必需的，不声明任何默认值就
@app.get("/items2/{item_id}")
def read_user_item(item_id: str, needy: str, skip: int = 0, limit: Union[int, None] = None):
    item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
    return item


'''
needy ，⼀个必需的str 类型参数。
skip ，⼀个默认值为0的 int 类型参数。
limit ，⼀个可选的int 类型参数，也是可选的。
'''


# ⼀个参数名，多个值
@app.get("/test/")
async def get_test(q: Union[List[str],None] = None):
    item = {"q": q}
    print(item)
    return item
@app.get("/test2/")
async def get_test(
    q: Optional[List[str]] = Query(
        default=None,
        list=True
    )
):
    item = {"q": q}
    print(item)
    return item

if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)
